/* 
Math.ceil();  //向上取整。
Math.floor();  //向下取整。
Math.round();  //四舍五入。
Math.random();  //0.0 ~ 1.0 之间的一个伪随机数。【包含0不包含1】 //比如0.8647578968666494
Math.ceil(Math.random()*10);      // 获取从1到10的随机整数 ，取0的概率极小。
Math.round(Math.random());   //可均衡获取0到1的随机整数。
Math.floor(Math.random()*10);  //可均衡获取0到9的随机整数。
Math.round(Math.random()*10);  //基本均衡获取0到10的随机整数，其中获取最小值0和最大值10的几率少一半。
因为结果在0~0.4 为0，0.5到1.4为1...8.5到9.4为9，9.5到9.9为10。所以头尾的分布区间只有其他数字的一半。
 Math.random()生成[0,1)的数，所以 Math.random()*5生成{0,5)的数。 
 parseInt()，Math.floor()，Math.ceil()和Math.round()都可得到整数。 
 parseInt()和Math.floor()结果都是向下取整。
 
 所以Math.random()*5生成的都是[0,4] 的随机整数。
 // max - 期望的最大值  min - 期望的最小值
 parseInt(Math.random()*(max-min+1)+min,10);
 Math.floor(Math.random()*(max-min+1)+min);
 */

// 抽奖对象模型
var LotteryObj = {
    "Name": "zhangshan", //姓名
    "WorkID": "B-12345", //工号
    "Prize": false, //是否已经中奖
    "PrizeName": "中奖名次",
    "ImageFileName": "",
    "Index": 0
};
var Global_LotterPool=[];
// 检验抽奖候选资源池数据准确性
function CheckLotteryPool(LotteryPool) {
	// 工号,姓名不能为空
	// 工号符合B-12345
	// 顺序索引必要和要对象中的Index 匹配
	for (var i = 0; i < LotteryPool.length; i++) {
		
		if (LotteryPool[i].Name.length < 1 ) {
			console.log("姓名不能为空");
			return 1;
		}
		if (LotteryPool[i].WorkID.length < 1 ) {
			console.log("工号不能为空");
			return 2;
		}
		
		if (LotteryPool[i].Index != i ) {
			console.log("抽奖池人员顺序和存储对象中的Index不匹配!");
			return 3;
		}
	}
	
	return 0;
}

//抽奖函数
function GetPrize(LotteryPool, PrizeCount = 1, PrizeName = "奖项名称") {
    /* 
    LotteryPool: 抽奖候选池子
    PrizeCount: 每次抽奖多少个,
    PrizeName: 奖项的名称,比如 一等奖,特等奖,二等奖之类
    return :
        PrizeList [] 中奖人员
    */   
	let PrizeList = [];
    if (typeof(LotteryPool)== "undefined" || LotteryPool == null) {
        return PrizeList;
    }

    if (LotteryPool.length < 1) {
        console.log("抽奖候选池为空");
		return PrizeList;
    }
	
	if (PrizeCount < 1) {
		console.log("奖项个数至少1个.");
		return PrizeList;
	}

    // 复制抽奖池的索引,防止破坏原池子数据乱序
	let PoolIndex = [];
	for (var i = 0; i < LotteryPool.length; i++) {		
		if (!LotteryPool[i].Prize) {
			PoolIndex.push(LotteryPool[i].Index);
		}
	}

    PrizeList = [];
    for (var i = 0; i < PrizeCount; i++) {
		
		if (PoolIndex.length < 1) {
			console.log("抽奖池已经没有数据了.");
			break;
		}
        
		// 抽奖候选池随机乱序排序
		console.log("抽奖候选池随机乱序排序 %d次", i);
        PoolIndex.sort(function(a, b) {
            return Math.random() > 0.5 ? -1 : 1;
        });
		
        // 生成随机索引		
        RandIDX = RandIndex(0, (PoolIndex.length - 1));
		console.log("生成随机索引 %d次 index: %d", i, RandIDX);

        //中奖后处理一:中奖了就删除抽奖资源池
        // PrizePerson = LotteryPool[PoolIndex[RandIDX]]; 此方法不适用, 赋值的还是全局对象,会修改全局对象数据
		let PrizePerson = Object.create(LotteryObj);
		PrizePerson.Name = LotteryPool[PoolIndex[RandIDX]].Name;
		PrizePerson.WorkID = LotteryPool[PoolIndex[RandIDX]].WorkID;		
		PrizePerson.ImageFileName = LotteryPool[PoolIndex[RandIDX]].ImageFileName;		
        PrizePerson.Prize = true;
        PrizePerson.PrizeName = PrizeName;
		PrizePerson.Index = LotteryPool[PoolIndex[RandIDX]].Index;
		
        PrizeList[i] = PrizePerson;
        PoolIndex.splice(RandIDX, 1); //删除中奖人

        ////中奖后处理二: 不删除抽奖资源池,只是判断是否同一批次已经抽奖过,是的话重新抽
        // if ( PrizeList.indexOf(PoolIndex[RandIDX]) != -1) {
        //     console.log("已经出现重复抽奖数据,重新抽奖,%d", PoolIndex[RandIDX]);
        //     i--;                    	
        // }else{
        //     PrizeList[i] = PoolIndex[RandIDX];
        //     // 中奖了就删除资源池
        // }


    }

    return PrizeList;

}

/* 
从图中可以看出Math.random()得到的是0~1之间的随机数。众所周知，sort()可以调用一个函数做为参数，如果这个函数返回的值为-1表示数组中的a项排在b项前。如此一来，可以写一个随机函数，让Math.random()随机出来的数与0.5做为一个比较，如果大于.5就返回 -1(a排在b前面)，反之返回1(b排在a前面)
 var arr = [1,2,3,4,5]; 
 console.log(arr.sort(function(a, b){return Math.random() > 0.5 ? -1 : 1;})); 
 */

function RandIndex(min = 0, max = 100) {
    /* 生成一个[Min, Max] 之间的自然数一个整数索引*/
    Math.random();
    Math.random();
    Math.random();
    let rand = Math.random();
    let RandIdx = Math.floor(rand * (max - min + 1) + min);
    console.log("Random随机生成的为: %f,随机生成的索引为: %d", rand, RandIdx);
    return RandIdx;

}

// 保存抽奖池人员信息到存储
function SaveLotterPool(LotteryPool) {
	if (typeof LotteryPool == undefined || LotteryPool == null) {
	    return ;
	}
	
	if (LotteryPool.length < 1) {
	    console.log("抽奖候选池为空");
		return;
	}
	
	// localStorage.setItem(key,JSON.stringify({val:value,time:curtime}));//转换成json字符串序列
	// var dataobj = JSON.parse(val); //解析出json对象	
	let WorkIDList = [];
	for (var i = 0; i < LotteryPool.length; i++) {

		// 用工号做索引,所以工号一定要唯一,而且必须不能为空
		localStorage.setItem(LotteryPool[i].WorkID, JSON.stringify(LotteryPool[i]));
		WorkIDList[i] = LotteryPool[i].WorkID;
	}
	
	//把抽奖人候选池存到一个Key中
	// localStorage.setItem("LotteryPool", JSON.stringify(LotteryPool));
	
	//把资源池的工号列表存储,用于读取校验抽奖人候选池
	localStorage.setItem("WorkIDPool", JSON.stringify(WorkIDList));
	
}

//读取抽奖池人员到数组对象中
function  GetLotterPool(LotteryPool) {
	//清空数组对象
	LotteryPool.splice(0, LotteryPool.length);
	WorkIDPool = JSON.parse(localStorage.getItem("WorkIDPool"));
	if (typeof(WorkIDPool)=="undefined" || WorkIDPool.length == 0) {
		console.log("未发现存储的抽奖池数据.")
		return;
	}
	
	for (var i = 0; i < WorkIDPool.length; i++) {		
		LotteryPool[i] = JSON.parse(localStorage.getItem(WorkIDPool[i]));
	}
	
	// 防止意外,获取出来后,按照存储对象中的Index进行排序
	LotteryPool.sort(function(a, b) {
            return a.Index < b.Index ? -1 : 1;
        });
}

function UpdateLotteryPool(DataSet) {
	for (var i = 0; i < DataSet.length; i++) {		
		localStorage.setItem(DataSet[i].WorkID, JSON.stringify(DataSet[i]));
		// 同步刷新全局变量状态
		Global_LotterPool[DataSet[i].Index].Prize = DataSet[i].Prize;
		Global_LotterPool[DataSet[i].Index].PrizeName = DataSet[i].PrizeName;		
	}
}

$().ready(

)